package cz.pecinovsky.česky.oopnz.záloha_do_budoucna;
//Příliš žluťoučký kůň úpěl ďábelské ódy
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++


/*******************************************************************************
 * Třída {@code ZrnitostHodinCykly} obsahuje několik statickým metod,
 * které testují zrnitost údajů systémových hodin a rychlost porcesoru.
 * Metody vypisují počet milisekund uplynuvších mezi dvěma tiky hodin
 * a současně také počet běhů cyklem mezi těmito tiky.
 * Většina metod provádí tento test opakovaně a tak názorně demonstruje
 * nerovnoměrnou rychlost zpracování programů.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class ZrnitostHodinCykly
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

    /***************************************************************************
     * Jednorázový test využívající cyklus do.
     */
    public static void testHodin_do()
    {
        long první = System.currentTimeMillis();
        int  dotaz = 0;
        long druhý;

        do{
            dotaz++;
            druhý = System.currentTimeMillis();
        }while( první == druhý );
        System.out.println("Tik " + (druhý-první) +
                           " ms po " + dotaz + ". čtení" );
    }


    /***************************************************************************
     * Opakování předchozího testu v cyklu while.
     * @param pokusů Kolikrát budeme probíhat cyklem
     */
    public static void testHodin_while( int pokusů )
    {
        int pokus = 1;

        System.out.println("===== ZAČÁTEK TESTU WHILE =====");
        while( pokus <= pokusů )
        {
            System.out.print( "Pokus " + pokus + ": " );
            testHodin_do();
            pokus++;
        }
        System.out.println("===== KONEC TESTU WHILE =====");
    }


    /***************************************************************************
     * Opakování předchozího testu v cyklu while.
     * @param pokusů Kolikrát budeme probíhat cyklem
     */
    public static void testHodin_for( int pokusů )
    {
        System.out.println("===== ZAČÁTEK TESTU FOR =====");
        for( int pokus = 1;   pokus <= pokusů;   pokus++ )
        {
            System.out.print( "Pokus " + pokus + ": " );
            testHodin_do();
        }
//      System.out.println("Provedli jsme " + pokus + " pokusů" );
        System.out.println("===== KONEC TESTU FOR =====");
    }


    /***************************************************************************
     * Opakování předchozího testu v cyklu while.
     */
    public static void nekonečný()
    {
        System.out.println("===== ZAČÁTEK NEKONEČNÉHO TESTU =====");
        for(;;)
        {
            testHodin_do();
        }
    //      System.out.println("===== KONEC NEKONEČNÉHO TESTU =====");
    }


    /***************************************************************************
     * Sloučení obou předchozích testů do jediné metody.
     * @param pokusů Kolikrát budeme probíhat cyklem
     */
    public static void testHodin_vnořený( int pokusů )
    {
        System.out.println("===== ZAČÁTEK TESTU S VNOŘENÝM CYKLEM =====");

        long minule = System.currentTimeMillis();

        for( int pokus = 1;   pokus <= pokusů;   pokus++ )
        {
            int  dotaz = 0;
            long nyní;

            do{
                dotaz++;
                nyní = System.currentTimeMillis();
            }while( nyní == minule );
            System.out.println("Pokus " + pokus +
                               ": tik " + (nyní-minule) +
                               " ms po " + dotaz + ". čtení" );
            minule = nyní;
        }
        System.out.println("===== KONEC TESTU S VNOŘENÝM CYKLEM =====");
    }


    /***************************************************************************
     * Sloučení obou předchozích testů do jediné metody.
     * @param sekund Jak dlouho budeme probíhat cyklem
     */
    public static void testHodin_uprostřed( int sekund )
    {
        System.out.println("===== ZAČÁTEK TESTU S PEVNOU DOBOU MĚŘENÍ =====");

        long start  = System.currentTimeMillis();
        long minule = start;

        for(;;)
        {
            long nyní;
            int  dotaz = 0;

            do{
                nyní = System.currentTimeMillis();
                dotaz++;
            }while( nyní == minule );
            long měří_s = (int)((nyní - start)/1000);

            if( měří_s  >=  sekund ) {  //Podmínka testující setrvání v cyklu
                break;                  //Příkaz k ukončení cyklu
            }
            int měří_ms = (int)((nyní - start)%1000);
            System.out.println("Čas " + měří_s + "s, " + měří_ms +
                               "ms, tik " + (nyní-minule) +
                               " ms po " + dotaz + ". čtení" );
            minule = nyní;
        }
        System.out.println("===== KONEC TESTU S PEVNOU DOBOU MĚŘENÍ =====");
    }


    /***************************************************************************
     * Metoda ukazuje, že v některých případech může mít cyklus prázdné tělo.
     * @param sekund Jak dlouho budeme probíhat cyklem
     */
    @SuppressWarnings("empty-statement")
    public static void testHodin_bezTěla( int sekund )
    {
        System.out.println("===== ZAČÁTEK TESTU S PRÁZDNÝM TĚLEM =====");
        long start  = System.currentTimeMillis();
        long minule = start;

        for(;;)
        {
            while( minule == System.currentTimeMillis() );
            long nyní = System.currentTimeMillis();
            long měří_s = (int)((nyní - start)/1000);

            if( měří_s  >=  sekund ) {  //Podmínka testující setrvání v cyklu
                break;                  //Příkaz k ukončení cyklu
            }
            int měří_ms = (int)((nyní - start)%1000);
            System.out.println("Čas " + měří_s + "s, " + měří_ms +
                               "ms, tik " + (nyní-minule) );
            minule = nyní;
        }
        System.out.println("===== KONEC TESTU S PRÁZDNÝM TĚLEM =====");
    }



//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    
    /** Soukromy konstruktor bránící vytvoření instance. */
    private ZrnitostHodinCykly() {}
    
    
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

